#include "cKey.h"
#include "cLibAll.h"
#include <stdio.h>


/*************************user interface**********************/
#define  cKEY_JITTER_Tms       50      //按键消抖时间
#define  cKEY_SHORT_KEY_Tms    1500    //短按键最长时间
#define  cKEY_LONG_KEY_Tms     3000    //长按键最短时间
#define  cKEY_OVER_FLOW_Tms    4000    //长按最长时间
#define  cKEY_READ_VAILD_VAL   0       //按下为低电平

typedef enum {
    KL_add = 0,
    KL_sub,
    KEY_NUM,
}KEY_LABLE;

static const char *info[KEY_NUM]={
    "ADD+",
    "SUB-"
};

uint8_t cKey_read(KEY_LABLE lable){
    switch (lable){
        case KL_add:{
            return GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3);
            break;
        }
        case KL_add:{
            return GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3);
            break;
        }
        default:{
            return 2;
            break;
        }
    }
}
/*************************************************************/

static KEY_STRUCT     *cKey[KEY_NUM];
int8 cKey_init(void){
    uint8_t lable=0;
    for(lable=0; lable<KEY_NUM;lable++){
        cKey[lable] = (KEY_STRUCT *)malloc(sizeof(KEY_STRUCT));
        if(cKey[lable]==NULL){
            return -1;
        }
        strcpy(cKey[lable]->info,info[lable]);
        cKey[lable]->value = KV_DEFAULT;
        cKey[lable]->lastVaule = KV_DEFAULT;
        cKey[lable]->flag  = KF_DEFAULT;
        cKey[lable]->time  = 0;
    }
    return 0;
}

uint8_t key_deal(void){
    uint8_t lable=0;
    for(lable=0;lable<=KEY_NUM;lable++){
        if(cKey_read(lable)!=cKEY_READ_VAILD_VAL){//松手了
            switch (cKey[lable]->flag){
                case KF_COUNT:{      //计时的时候出现了高电平
                    cKey[lable]->flag =KF_DEFAULT;
                    cKey[lable]->value=KV_DEFAULT;
                    break;
                }
                case KF_VALID:{                                 
                    cKey[lable]->flag=KF_OUT;
                    // break;  故意去掉
                }
                case KF_OUT:{
                    if(cKey[lable]->time<cKEY_SHORT_KEY_Tms){
                        cKey[lable]->value = KV_SHORT;          //使用键值后，若不释放，则下次则不会被触发
                        cKey[lable]->flag  = KF_SHORT_KEY;
                    }
                    else if(cKey[lable]->time>=cKEY_LONG_KEY_Tms && cKey[lable]->time<=cKEY_OVER_FLOW_Tms){
                        cKey[lable]->value = KV_LONG;
                        cKey[lable]->flag  = KF_LONG_KEY;
                    }
                    else{
                        cKey[lable]->value = KV_DEFAULT;
                        cKey[lable]->flag  = KF_DEFAULT;
                    }
                    break;
                }
                // case KF_LONG_KEY:{
                //     cKey[lable]->flag =KF_DEFAULT;
                //     cKey[lable]->value=KV_DEFAULT;
                //     break;
                // }
                // case KF_SHORT_KEY:{
                //     cKey[lable]->flag =KF_DEFAULT;
                //     cKey[lable]->value=KV_DEFAULT;
                //     break;
                // }
                default:break;
            }

        }
    }
}
void cKey_exti_interrupt_handler(KEY_LABLE lable){
    if(cKey[lable]->flag == KF_DEFAULT && cKey_read(lable)==cKEY_READ_VAILD_VAL ){
        cKey[lable]->flag=KF_COUNT;
        cKey[lable]->time=0;
    }
}
void cKey_timer_interrupt_handler(KEY_LABLE lable){
    uint8_t lable=0;
    for(lable=0;lable<KEY_NUM;lable++){
        if(cKey[lable]->flag>=KF_COUNT && cKey[lable]->time<=cKEY_OVER_FLOW_Tms){
            cKey[lable]->time++;
            if(cKey[lable]->time>=cKEY_LONG_KEY_Tms){
                cKey[lable]->flag = KF_OUT;
            }
        }
    }
}
